/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.web.servlet.mvc.method.annotation

import org.junit.Assert.*
import org.junit.Test
import org.springframework.mock.web.test.MockHttpServletRequest
import org.springframework.mock.web.test.MockHttpServletResponse
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

/**
 * @author Sebastien Deleuze
 */
class ServletAnnotationControllerHandlerMethodKotlinTests : AbstractServletHandlerMethodTests() {

    @Test
    fun dataClassBinding() {
        initServletWithControllers(DataClassController::class.java)

        val request = MockHttpServletRequest("GET", "/bind")
        request.addParameter("param1", "value1")
        request.addParameter("param2", "2")
        val response = MockHttpServletResponse()
        servlet.service(request, response)
        assertEquals("value1-2", response.contentAsString)
    }

    @Test
    fun dataClassBindingWithOptionalParameterAndAllParameters() {
        initServletWithControllers(DataClassController::class.java)

        val request = MockHttpServletRequest("GET", "/bind-optional-parameter")
        request.addParameter("param1", "value1")
        request.addParameter("param2", "2")
        val response = MockHttpServletResponse()
        servlet.service(request, response)
        assertEquals("value1-2", response.contentAsString)
    }

    @Test
    fun dataClassBindingWithOptionalParameterAndOnlyMissingParameters() {
        initServletWithControllers(DataClassController::class.java)

        val request = MockHttpServletRequest("GET", "/bind-optional-parameter")
        request.addParameter("param1", "value1")
        val response = MockHttpServletResponse()
        servlet.service(request, response)
        assertEquals("value1-12", response.contentAsString)
    }


    data class DataClass(val param1: String, val param2: Int)

    data class DataClassWithOptionalParameter(val param1: String, val param2: Int = 12)

    @RestController
    class DataClassController {

        @RequestMapping("/bind")
        fun handle(data: DataClass) = "${data.param1}-${data.param2}"

        @RequestMapping("/bind-optional-parameter")
        fun handle(data: DataClassWithOptionalParameter) = "${data.param1}-${data.param2}"
    }

}
